import {
  Controller,
  Get,
  Post,
  Body,
  Patch,
  Param,
  Delete,
  UseFilters,
  UseGuards,
} from '@nestjs/common';
import { RolesService } from './roles.service';
import { CreateRoleDto } from './dto/create-role.dto';
import { UpdateRoleDto } from './dto/update-role.dto';
import { TypeormFilter } from 'src/filters/typeorm.filter';
import { JwtGuard } from 'src/guards/admin/jwt.guard';
import { AdminGuard } from 'src/guards/admin/admin.guard';
import { Roles } from 'src/decorators/roles.decorators';
import { Role } from 'src/enum/roles.enum';
import { RoleGuard } from 'src/guards/role/role.guard';


@Controller('roles')
@UseFilters(new TypeormFilter())  // 注入 typeOrm出错的过滤器

// 注入自定义装饰器的方法  意思是 role模块都要校验是不是admin角色 
// 这种方式的缺点： 必须在enum写好静态的角色配置 生产环境时 不满足需求
// 从项目中感觉 @Roles(Role.Admin)  RoleGuard 没有太大差别
@Roles(Role.Admin)  
@UseGuards(JwtGuard , RoleGuard)  // roles模块 全局校验是否携带token 、角色是否有权限
export class RolesController {
    constructor(private readonly rolesService: RolesService) {}

    @Post('/create')
    create(@Body() createRoleDto: CreateRoleDto) {
        return this.rolesService.create(createRoleDto);
    }

    @Get('/all')
    @Roles(Role.Test) // 配置调试 此接口test角色也可以访问
    findAll() {
        return this.rolesService.findAll() 
    }

    @Get(':id')
    findOne(@Param('id') id: string) {
        return this.rolesService.findOne(id);
    }

    @Patch(':id')
    update(@Param('id') id: string, @Body() updateRoleDto: UpdateRoleDto) {
        return this.rolesService.update(id, updateRoleDto);
    }

}
